package com.hjx.leetcode;

import java.util.Arrays;
import java.util.function.Predicate;

/**
 * 867、矩阵转置
 *
 * 给定一个矩阵 A， 返回 A 的转置矩阵。
 *
 * 矩阵的转置是指将矩阵的主对角线翻转，交换矩阵的行索引与列索引。
 *
 *  
 *
 * 示例 1：
 *
 *  输入：[[1,2,3],[4,5,6],[7,8,9]]
 *  输出：[[1,4,7],[2,5,8],[3,6,9]]
 * 示例 2：
 *
 *  输入：[[1,2,3],[4,5,6]]
 *  输出：[[1,4],[2,5],[3,6]]
 *  
 *
 * 提示：
 *
 * 1 <= A.length <= 1000
 * 1 <= A[0].length <= 1000
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/transpose-matrix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author houjinxin
 * @version 创建时间：2020/10/7.
 */
public class LeetCode_867 {

    public int[][] swapArr(int[][] mxn) {

        int m = mxn.length;
        int n = mxn[0].length;
        int times = 1;
        int[][] ret = new int[n][m];
        // i 行  j 列
        for (int i=0, j=0; times <= m * n; times++) {

            ret[i][j] = mxn[j][i];
            j++;
            //m * n 矩阵 每逢m个元素换行  只有在m为2的幂次方时 （m - 1） & times 等价于 times % m
            if (times % m == 0) {
                //i 累加  j 清零
                i++;
                j=0;
            }
        }
        return ret;
    }

    public int[][] transpose(int[][] A) {
        int row = A[0].length;   //用原矩阵的列当作转置矩阵的行
        int column = A.length;   //用原矩阵的行当作转置矩阵的列
        int [][] ans = new int[row][column];

        if(row == column){     //判断是否为方阵
            for(int i=0;i<row;i++){
                for(int j=i; j < column; j++){
                    ans[i][j] = A[j][i];//若为方阵，直接内部对称交换，节约时间
                    ans[j][i] = A[i][j];
            } 
            }
        } else {
            for(int i=0; i<row; i++){
                for(int j=0; j < column; j++){
                    ans[i][j] = A[j][i];//不为方阵，按顺序赋值
                }
            }
        }
        return ans;
    }

}
